package juc_synchronized;

import java.util.concurrent.locks.ReentrantLock;

/**
 * ClassName: ReentrantLockTest
 * Package: juc_synchronized
 *
 * @Author 马学兴
 * @Create 2024/3/17 14:41
 * @Version 1.0
 * Description:可重入锁：就是一个线程获取的锁之后，这个现在在没有释放该锁之前，可以再次进入获取该锁，这像递归调用，同一个线程多次进入同一个锁。
 * 同步的原因：ReentrantLock 的实现依赖于同步器框架 AbstranctQueuedSynchronizer。
 */
public class ReentrantLockTest {
    static ReentrantLock reen = new ReentrantLock();

    static class MyThread implements Runnable{
        @Override
        public void run() {
            try {
                reen.lock();//尝试获取锁
                System.out.println(Thread.currentThread() + "拿到锁了，窗口办理事情中");
                Thread.sleep(1000);
            } catch (Exception e) {
                e.printStackTrace();
            }finally {
                // 释放持有的许可证
                reen.unlock();
            }
        }
    }
    // 开始测试
    public static void main(String[] args) {
        // 10个人来银行办理，不过每次只能一个人进去办理办理
        for (int i = 0; i < 10; i++) {
            Thread t = new Thread(new MyThread());
            t.start();
        }
    }
}
